home *** CD-ROM | disk | FTP | other *** search
/ Amiga Packmags / Source, The - Issue 5 (1993)(Epsilon)[WB].zip / Source, The - Issue 5 (1993)(Epsilon)[WB].adf / Source / Vectors / Rendering / Triangle.lha / triangle.c < prev    next >
Text File  |  1991-09-04  |  7KB  |  395 lines

  1.  
  2. void drawTriangle(unsigned x1,unsigned y1,unsigned x2,unsigned y2,unsigned x3,unsigned y3,unsigned char c)
  3. {unsigned int bendCheck,slope1,slope2,slope3,z1,first,z2,last,z3,aux,z4;
  4. unsigned char sign1,sign2,sign3,firstSign,lastSign,auxSign; /* were boolean */
  5. unsigned char bend;
  6.  
  7. z1=0; z2=0; z3=0; z4=0; /*note: don't take these out.  They're nescessary*/
  8. /*do a quick little insertion sort on the points*/
  9. if (y2<y1)
  10.     {asm mov ax,y1
  11.     asm mov bx,y2
  12.     asm mov y1,bx
  13.     asm mov y2,ax
  14.     asm mov ax,x1
  15.     asm mov bx,x2
  16.     asm mov x1,bx
  17.     asm mov x2,ax  /*swap point 1 and point 2*/
  18.     }
  19. if (y3<y2)
  20.     {asm mov ax,y3
  21.     asm mov bx,y2
  22.     asm mov y3,bx
  23.     asm mov y2,ax
  24.     asm mov ax,x3
  25.     asm mov bx,x2
  26.     asm mov x3,bx
  27.     asm mov x2,ax  /*swap point 3 and point 2*/
  28.     }
  29. if (y2<y1)
  30.     {asm mov ax,y1
  31.     asm mov bx,y2
  32.     asm mov y1,bx
  33.     asm mov y2,ax
  34.     asm mov ax,x1
  35.     asm mov bx,x2
  36.     asm mov x1,bx
  37.     asm mov x2,ax  /*swap point 1 and point 2*/
  38.     }
  39.  
  40. /*make sure that no two points have the same y value*/
  41. if (y1==y2)
  42.     {y2++;
  43.     y3++;
  44.     }
  45. if (y2==y3) y3++;
  46.  
  47. /*calculate them slopes, avoiding pascal's meddling with assembly*/
  48.  
  49. if (x1<x2)
  50.     {asm mov dx,0
  51.     asm mov ax,x2
  52.     asm sub ax,x1
  53.     asm mov ah,al
  54.     asm mov al,0
  55.     asm mov bx,y2
  56.     asm sub bx,y1
  57.     asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
  58.     asm mov slope2,ax
  59.     asm mov byte ptr sign2,0 /*line2 has positive slope*/
  60.     }
  61. else
  62.     {asm mov dx,0
  63.     asm mov ax,x1
  64.     asm sub ax,x2
  65.     asm mov ah,al
  66.     asm mov al,0
  67.     asm mov bx,y2
  68.     asm sub bx,y1
  69.     asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
  70.     asm mov slope2,ax
  71.     asm mov byte ptr sign2,1 /*line2 has negative slope*/
  72.     }
  73.  
  74. if (x3<x1)
  75.     {asm mov dx,0
  76.     asm mov ax,x1
  77.     asm sub ax,x3
  78.     asm mov ah,al
  79.     asm mov al,0
  80.     asm mov bx,y3
  81.     asm sub bx,y1
  82.     asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
  83.     asm mov slope1,ax
  84.     asm mov byte ptr sign1,1 /*line1 has negative slope*/
  85.     }
  86. else
  87.     {asm mov dx,0
  88.     asm mov ax,x3
  89.     asm sub ax,x1
  90.     asm mov ah,al
  91.     asm mov al,0
  92.     asm mov bx,y3
  93.     asm sub bx,y1
  94.     asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
  95.     asm mov slope1,ax
  96.     asm mov byte ptr sign1,0 /*line1 has positive slope*/
  97.     }
  98.  
  99. if (x3<x2)
  100.     {asm mov dx,0
  101.     asm mov ax,x2
  102.     asm sub ax,x3
  103.     asm mov ah,al
  104.     asm mov al,0
  105.     asm mov bx,y3
  106.     asm sub bx,y2
  107.     asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
  108.     asm mov slope3,ax
  109.     asm mov aux,ax
  110.     asm mov byte ptr sign3,1 /*line3 has negative slope*/
  111.     asm mov byte ptr auxSign,1
  112.     }
  113. else
  114.     {asm mov dx,0
  115.     asm mov ax,x3
  116.     asm sub ax,x2
  117.     asm mov ah,al
  118.     asm mov al,0
  119.     asm mov bx,y3
  120.     asm sub bx,y2
  121.     asm div bx /*ax:=256*(x2-x1) div (y2-y1)*/
  122.     asm mov slope3,ax
  123.     asm mov aux,ax
  124.     asm mov byte ptr sign3,0 /*line3 has positive slope*/
  125.     asm mov byte ptr auxSign,0
  126.     }
  127.  
  128. /*assign first and second*/
  129. if (sign1)
  130.     {/*line1 is negative*/
  131.     if (sign2)
  132.         {/*both lines are negative*/
  133.         if (slope1>slope2)
  134.             {first=slope1; firstSign=sign1; last=slope2; lastSign=sign2; bend=2;}
  135.       else
  136.             {first=slope2; firstSign=sign2; last=slope1; lastSign=sign1; bend=1;}
  137.         }
  138.    else
  139.         {/*line1 is negative, but line2 is positive*/
  140.         first=slope1; firstSign=sign1; bend=2;
  141.         last=slope2; lastSign=sign2;
  142.         }
  143.     }
  144. else
  145.     {/*line1 is positive*/
  146.     if (sign2)
  147.         {/*line1 is positive, but line2 is negative*/
  148.         first=slope2; firstSign=sign2; bend=1;
  149.         last=slope1; lastSign=sign1;
  150.         }
  151.    else
  152.         {/*both lines are positive*/
  153.         if (slope1>slope2)
  154.             {bend=1; first=slope2; firstSign=sign2; last=slope1; lastSign=sign1;}
  155.       else
  156.             {bend=2; first=slope1; firstSign=sign1; last=slope2; lastSign=sign2;}
  157.         }
  158.     }
  159.  
  160. bendCheck=y3-y2+1;
  161. x2=320*y2+x2;
  162.  
  163. /*draw the triangle (finnaly)*/
  164.  
  165. /*; bx=screenpos of first line
  166. ; si=screenpos of last line
  167. ; dh=bx remainder
  168. ; dl=si remainder
  169. ; al=color*/
  170. asm push es
  171. asm push si
  172. asm push di
  173. asm mov ax,0a000h
  174. asm mov es,ax /*;point es to screen*/
  175. asm mov ax,y1
  176. asm mov bx,320
  177. asm mul bx
  178. asm add ax,x1
  179. asm mov bx,ax /*;bx=screen pos of first line*/
  180. asm mov si,ax /*;si=screen pos of second line (they both start at point1)*/
  181. asm mov cx,y3
  182. asm sub cx,y1 /*;cx=height of triangle*/
  183. asm mov al,c /*;color*/
  184. asm mov ah,c
  185. asm mov dx,0
  186.  
  187. asm cmp byte ptr firstSign,1
  188. asm je l1out
  189. asm cmp byte ptr lastSign,1
  190. asm je l2out
  191. asm jmp pospos
  192. l2out:
  193. asm jmp negpos
  194. l1out:
  195. asm cmp byte ptr lastSign,1
  196. asm je l3out
  197. asm jmp negpos
  198. l3out:
  199. asm jmp negneg
  200. /*;shouldn't get here*/
  201.  
  202. /*; neg-pos*/
  203. negpos:
  204. asm push cx
  205. asm mov cx,si
  206. asm sub cx,bx
  207. asm mov di,bx
  208. asm test di,01
  209. asm je l1np
  210. asm stosb
  211. asm dec cx
  212. l1np:
  213. asm cmp cx,0
  214. asm jl l9np
  215. asm shr cx,1
  216. asm jc l2np
  217. asm rep stosw
  218. asm jmp l9np
  219. l2np:
  220. asm rep stosw
  221. asm stosb /*;flags still preserved from shr cx,1*/
  222. l9np:
  223.  
  224. asm add bx,320
  225. asm sub dh,first
  226. asm sbb bx,[first+1]
  227. asm add si,320
  228. asm add dl,last
  229. asm adc si,[last+1]
  230.  
  231. asm pop cx
  232. asm cmp cx,bendCheck
  233. asm je l1npo
  234. negPosEntry:
  235. asm loop negpos /*;yloop*/
  236. asm jmp outaHere
  237. l1npo:
  238. asm jmp switchdirs
  239.  
  240. /*; pos-neg*/
  241. posneg:
  242. asm push cx
  243. asm mov cx,si
  244. asm sub cx,bx
  245. asm mov di,bx
  246. asm test di,01
  247. asm je l1pn
  248. asm stosb
  249. asm dec cx
  250. l1pn:
  251. asm cmp cx,0
  252. asm jl l9pn
  253. asm shr cx,1
  254. asm jc l2pn
  255. asm rep stosw
  256. asm jmp l9pn
  257. l2pn:
  258. asm rep stosw
  259. asm stosb /*;flags still preserved from shr cx,1*/
  260. l9pn:
  261.  
  262.  
  263. asm add bx,320
  264. asm add dh,first
  265. asm adc bx,[first+1]
  266. asm add si,320
  267. asm sub dl,last
  268. asm sbb si,[last+1]
  269.  
  270. asm pop cx
  271. asm cmp cx,bendCheck
  272. asm je l1pno
  273. posnegEntry:
  274. asm loop posneg /*;yloop*/
  275. asm jmp outaHere
  276. l1pno:
  277. asm jmp switchdirs
  278.  
  279. /*; neg-neg*/
  280. negneg:
  281. asm push cx
  282. asm mov cx,si
  283. asm sub cx,bx
  284. asm mov di,bx
  285. asm test di,01
  286. asm je l1nn
  287. asm stosb
  288. asm dec cx
  289. l1nn:
  290. asm cmp cx,0
  291. asm jl l9nn
  292. asm shr cx,1
  293. asm jc l2nn
  294. asm rep stosw
  295. asm jmp l9nn
  296. l2nn:
  297. asm rep stosw
  298. asm stosb /*;flags still preserved from shr cx,1*/
  299. l9nn:
  300.  
  301.  
  302. asm add bx,320
  303. asm sub dh,first
  304. asm sbb bx,[first+1]
  305. asm add si,320
  306. asm sub dl,last
  307. asm sbb si,[last+1]
  308.  
  309. asm pop cx
  310. asm cmp cx,bendCheck
  311. asm je l1nno
  312. negnegEntry:
  313. asm loop negneg /*;yloop*/
  314. asm jmp outaHere
  315. l1nno:
  316. asm jmp switchdirs
  317.  
  318. /*; pos-pos*/
  319. pospos:
  320. asm push cx
  321. asm mov cx,si
  322. asm sub cx,bx
  323. asm mov di,bx
  324. asm test di,01
  325. asm je l1pp
  326. asm stosb
  327. asm dec cx
  328. l1pp:
  329. asm cmp cx,0
  330. asm jl l9pp
  331. asm shr cx,1
  332. asm jc l2pp
  333. asm rep stosw
  334. asm jmp l9pp
  335. l2pp:
  336. asm rep stosw
  337. asm stosb /*;flags still preserved from shr cx,1*/
  338. l9pp:
  339.  
  340. asm add bx,320
  341. asm add dh,first
  342. asm adc bx,[first+1]
  343. asm add si,320
  344. asm add dl,last
  345. asm adc si,[last+1]
  346.  
  347. asm pop cx
  348. asm cmp cx,bendCheck
  349. asm je switchdirs
  350. posposEntry:
  351. asm loop pospos /*;yloop*/
  352. asm jmp outaHere
  353.  
  354. switchdirs:
  355. asm push ax
  356. asm cmp byte ptr bend,2 /*;compare x pos of first with xpos of auxiliary*/
  357. asm je l9sw
  358. /*;first needs to bend*/
  359. asm mov y2,si
  360. asm mov bx,x2
  361. asm mov ax,aux
  362. asm mov first,ax
  363. asm mov ah,auxSign
  364. asm mov firstSign,ah
  365. asm jmp l8sw
  366. l9sw:
  367. /*;last needs to bend*/
  368. asm mov si,x2
  369. asm mov ax,aux
  370. asm mov last,ax
  371. asm mov ah,auxSign
  372. asm mov lastSign,ah
  373. l8sw:
  374. asm pop ax
  375. asm cmp byte ptr firstSign,1
  376. asm je l1sw
  377. asm cmp byte ptr lastSign,1
  378. asm je l2sw
  379. asm jmp posposEntry
  380. l2sw:
  381. asm jmp posnegEntry
  382. l1sw:
  383. asm cmp byte ptr lastSign,1
  384. asm je l3sw
  385. asm jmp posnegEntry
  386. l3sw:
  387. asm jmp negnegEntry
  388. /*;shouldn't get here*/
  389.  
  390. outaHere:
  391. asm pop di
  392. asm pop si
  393. asm pop es
  394. }
  395.